package com.xq.proxy.jdk;

import lombok.Data;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author xq
 * @version 1.0
 * @date 2021/4/6 10:51
 * @description jdk代理工厂
 */
@Data
public class ProxyFactory {
    /**
     * 目标对象
     */
    private Object target;

    public ProxyFactory(Object target) {
        super();
        this.target = target;
    }

    /**
     * 生成代理对象
     * @return 返回代理对象
     */
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), new InvocationHandler() {
                    /**
                     * @param proxy 代理对象
                     * @param method 当去调用方法时传过来的方法相关信息
                     * @param args 方法的参数列表
                     * @return 返回对象
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("方法名：" + method.getName());
                        System.out.println("方法的第一个参数："+args[0]);
                        // 调用目标对象的方法
                        before();
                        Object invoke = method.invoke(target, args);
                        after();
                        return invoke;
                    }
                });
    }

    /**
     * 前置增强
     */
    public void before() {
        System.out.println("饭前吃水果");
    }

    /**
     * 后置增强
     */
    public void after() {
        System.out.println("吃完饭散步");
    }
}
